"""
Seaborn基础入门
==============

Seaborn是基于matplotlib的Python数据可视化库，提供了高级接口来绘制有吸引力且信息丰富的统计图形。

主要特点：
- 基于matplotlib构建，但提供更高级的接口
- 内置多种统计图表类型
- 优美的默认样式和调色板
- 与pandas数据结构紧密集成
- 支持多变量数据的复杂可视化

安装命令：
pip install seaborn

或者使用conda：
conda install seaborn
"""

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False

print("=" * 50)
print("Seaborn基础入门")
print("=" * 50)

# 1. 查看Seaborn版本和基本信息
print(f"Seaborn版本: {sns.__version__}")
print(f"内置数据集: {len(sns.get_dataset_names())} 个")
print("部分内置数据集:", sns.get_dataset_names()[:10])

# 2. 设置Seaborn样式
print("\n2. 样式设置")
print("-" * 30)

# 查看可用样式
print("可用样式:", sns.axes_style().keys())
print("可用上下文:", ['paper', 'notebook', 'talk', 'poster'])

# 设置样式和上下文
sns.set_style("whitegrid")  # 白色网格背景
sns.set_context("notebook")  # 笔记本上下文

# 3. 加载内置数据集进行演示
print("\n3. 内置数据集演示")
print("-" * 30)

# 加载经典的iris数据集
iris = sns.load_dataset('iris')
print("Iris数据集形状:", iris.shape)
print("\n前5行数据:")
print(iris.head())

# 加载tips数据集
tips = sns.load_dataset('tips')
print("\nTips数据集形状:", tips.shape)
print("\n前5行数据:")
print(tips.head())

# 4. 基本绘图示例
print("\n4. 基本绘图示例")
print("-" * 30)

# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('Seaborn基础图表示例', fontsize=16)

# 4.1 散点图
sns.scatterplot(data=iris, x='sepal_length', y='sepal_width', 
                hue='species', ax=axes[0,0])
axes[0,0].set_title('散点图 - 鸢尾花数据')

# 4.2 直方图
sns.histplot(data=tips, x='total_bill', hue='time', 
             multiple="stack", ax=axes[0,1])
axes[0,1].set_title('直方图 - 账单分布')

# 4.3 箱线图
sns.boxplot(data=tips, x='day', y='total_bill', ax=axes[1,0])
axes[1,0].set_title('箱线图 - 不同日期的账单')

# 4.4 小提琴图
sns.violinplot(data=iris, x='species', y='petal_length', ax=axes[1,1])
axes[1,1].set_title('小提琴图 - 花瓣长度分布')

plt.tight_layout()
plt.show()

# 5. Seaborn与Matplotlib的关系
print("\n5. Seaborn与Matplotlib的关系")
print("-" * 30)
print("- Seaborn基于matplotlib构建")
print("- 可以与matplotlib命令混合使用")
print("- Seaborn提供更高级的统计可视化接口")
print("- matplotlib提供更底层的绘图控制")

# 6. 数据准备最佳实践
print("\n6. 数据准备最佳实践")
print("-" * 30)

# 创建示例数据
np.random.seed(42)
sample_data = pd.DataFrame({
    'x': np.random.randn(100),
    'y': np.random.randn(100),
    'category': np.random.choice(['A', 'B', 'C'], 100),
    'value': np.random.randint(1, 100, 100)
})

print("示例数据结构:")
print(sample_data.info())
print("\n数据预览:")
print(sample_data.head())

# 简单的相关性分析可视化
plt.figure(figsize=(8, 6))
sns.scatterplot(data=sample_data, x='x', y='y', hue='category', size='value')
plt.title('多变量散点图示例')
plt.show()

# 7. 常用配置参数
print("\n7. 常用配置参数")
print("-" * 30)
print("图形尺寸: plt.figure(figsize=(width, height))")
print("调色板: sns.color_palette() 或 palette参数")
print("透明度: alpha参数")
print("标记大小: s参数(scatter) 或 size参数")
print("线条样式: linestyle参数")

# 8. 保存图片
print("\n8. 保存图片")
print("-" * 30)
print("使用plt.savefig()保存:")
print("plt.savefig('filename.png', dpi=300, bbox_inches='tight')")

print("\n基础入门完成！")
print("接下来可以学习具体的图表类型...")
